package br.com.mkmts.dao.jpa.cadastro;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import org.springframework.stereotype.Repository;

import br.com.mkmts.dao.cadastro.ConsultoraDao;
import br.com.mkmts.dao.jpa.JpaGenericDao;
import br.com.mkmts.dto.ConsultoraDTO;
import br.com.mkmts.model.ConsultoraEntity;
import br.com.mkmts.utils.Adapter;
import br.com.mkmts.utils.MkmtsUtil;

@Repository
public class ConsultoraDaoImpl extends JpaGenericDao<ConsultoraEntity, Integer> implements ConsultoraDao{

	
	
	@Override
	public List<ConsultoraDTO> findByFiltroPesquisa(Integer codConsultoraFiltro,
			String email, String nomeFiltro, Long celularFiltro) {
		
		boolean flagQuery = false;
		
		StringBuilder query = new StringBuilder();
		query.append(SELECT);
		query.append(_ESPACE);
		
		if(codConsultoraFiltro > 0){
			query.append("WHERE c.codConsultora = "+codConsultoraFiltro);
			query.append(_ESPACE);
			flagQuery = true;
		}
		
		if(!email.equals("")){
			if(flagQuery){
				query.append("AND c.dadosPessoa.email = '"+email+"'");
				query.append(_ESPACE);
			}else{
				query.append("WHERE c.dadosPessoa.email = '"+email+"'");
				query.append(_ESPACE);
				flagQuery = true;
			}
		}

		if(!nomeFiltro.equals("")){
			if(flagQuery){
				query.append("AND c.dadosPessoa.nome LIKE '"+nomeFiltro+"%'");
				query.append(_ESPACE);
			}else{
				query.append("WHERE c.dadosPessoa.nome LIKE '"+nomeFiltro+"%'");
				query.append(_ESPACE);
				flagQuery = true;
			}
		}

		if(celularFiltro > 0){
			if(flagQuery){
				query.append("AND c.dadosPessoa.numCelular = '"+celularFiltro+"'");
				query.append(_ESPACE);
			}else{
				query.append("WHERE c.dadosPessoa.numCelular = '"+celularFiltro+"'");
				query.append(_ESPACE);
				flagQuery = true;
			}
		}
		
		query.append(ORDER_BY);
		
		List<ConsultoraEntity>listaRetornada = getEntityManager().createQuery(query.toString(), ConsultoraEntity.class).getResultList();
		return recuperarOcorrencias(listaRetornada);
	}

	@Override
	public boolean existCellPhoneConsulter(ConsultoraDTO consultora) {
		StringBuilder builder = new StringBuilder();
		builder.append(SELECT);
		builder.append(_ESPACE);
		builder.append("WHERE c.dadosPessoa.numCelular = "+consultora.getDadosPessoa().getNumCelular());
		builder.append(_ESPACE);
		if(MkmtsUtil.verificaLongNulo(consultora.getCodConsultora()) > 0 ){
			builder.append("AND c.codConsultora <> "+consultora.getCodConsultora()+"");
			builder.append(_ESPACE);
		}
		builder.append(ORDER_BY);
		
		try{
			if(getEntityManager().createQuery(builder.toString()).getSingleResult() == null){
				return false;
			}
			return true;
		}catch(NoResultException nre){
			return false;
		}
	}
	
	@Override
	public boolean existEmailConsulter(ConsultoraDTO consultora) {
		
		StringBuilder builder = new StringBuilder();
		builder.append(SELECT);
		builder.append(_ESPACE);
		builder.append("WHERE c.dadosPessoa.email = '"+consultora.getDadosPessoa().getEmail()+"'");
		builder.append(_ESPACE);
		if(MkmtsUtil.verificaLongNulo(consultora.getCodConsultora()) > 0 ){
			builder.append("AND c.codConsultora <> "+consultora.getCodConsultora()+"");
		}
		builder.append(_ESPACE);
		builder.append(ORDER_BY);
		
		try{
			if(getEntityManager().createQuery(builder.toString()).getSingleResult() == null){
				return false;
			}
			return true;
		}catch(NoResultException nre){
			return false;
		}
		
	}
	
	@Override
	public boolean existIDConsulter(ConsultoraDTO consultora) {
		StringBuilder builder = new StringBuilder();
		builder.append(SELECT);
		builder.append(_ESPACE);
		builder.append("WHERE c.codConsultora = "+consultora.getCodConsultora());
		try{
			if(getEntityManager().createQuery(builder.toString()).getSingleResult() == null){
				return false;
			}
			return true;
		}catch(NoResultException nre){
			return false;
		}
	}
	
	private List<ConsultoraDTO> recuperarOcorrencias(List<ConsultoraEntity>listaRetornada){
		List<ConsultoraDTO> listaSaida = new ArrayList<ConsultoraDTO>();
		if(!MkmtsUtil.verificaListNullOrEmpty(listaRetornada)){
			for (int i = 0; i < listaRetornada.size(); i++) {
				listaSaida.add(Adapter.entityToDto(listaRetornada.get(i)));
			}
		}
		return listaSaida;
	}
	
}
